Description |
---|
Cette macro rend le découpage de logement très facilement cette macro doit être upgraded Version macro : 0.25 Date dernière modification : 2016-11-26 Version FreeCAD : 0.16 Téléchargement : ToolBar Icon Auteur: maurice |
Auteur |
maurice |
Téléchargement |
ToolBar Icon |
Liens |
Page des macros Comment installer une macro Comment créer une barre d'outils |
Version Macro |
0.25 |
Dernière modification |
2016-11-26 |
Version(s) FreeCAD |
0.16 |
Raccourci clavier |
None |
Voir aussi |
None |
Cette macro crée un logement d'un objet sur un support de façon très aisée
Vous devez juste sélectionner la face qui servira de support et l'objet à encastrer la macro s'occupe de créer le logement avec un espace de 0.5 mm (programmé dans la macro)
Ici une démonstration avec Arduino Uno enclosure
Vous devez juste sélectionner la face qui servira de support et l'objet à encastrer la macro s'occupe de créer le logement avec un espace de 0.5 mm (programmé dans la macro)
L'icône pour votre barre d'outils
Macro_Easy_cutouts_for_Enclosure_Design.FCMacro
# -*- coding: utf-8 -*- # clone, enlarge & center clone-obj to selected obj # __title__ = "Clone-Enlarge-Center Face for cutouts" __author__ = "maurice" __url__ = "kicad stepup" __version__ = "0.25" __date__ = "11.2016" import FreeCAD, FreeCADGui, Draft, Part, DraftTools from FreeCAD import Base def say(msg): FreeCAD.Console.PrintMessage(msg) FreeCAD.Console.PrintMessage('\n') def sayw(msg): FreeCAD.Console.PrintWarning(msg) FreeCAD.Console.PrintWarning('\n') def getNormal(self): return self.Object.Shape.Faces[0].normalAt(0,0) #Init if Gui.ActiveDocument <> None: #say (Gui.ActiveDocument) cx = 1 # center x -> 1 cy = 1 # center y -> 1 cz = 1 # center z -> 1 # scaleX = 1.1 # scale factor for Clone # scaleY = 1.1 # scale factor for Clone # scaleZ = 1.1 # scale factor for Clone margin = 0.5 #margin in mm extrudeLenght = 10 #10mm #selEx = FreeCADGui.Selection.getSelectionEx() sel = FreeCADGui.Selection.getSelection() #print sel[0].Label #objs = [selobj.Object for selobj in selEx] selF = FreeCADGui.Selection.getSelectionEx() #if len(Gui.Selection.getSelectionEx()[0].SubElementNames) <1: # stop if len(sel) > 0: FreeCADGui.Selection.removeSelection(sel[0]) #for o in FreeCADGui.ActiveDocument.getObjects(): # FreeCADGui.Selection.removeSelection(o.Name) coords = [] j = 0 #if len(sel) == 1: # only 1 object selected #if len(selF) == 1: # only 1 object selected if len(sel) > 0: if len(selF[0].SubElementNames) ==1: f_names=[] f = Draft.makeFacebinder(selF) f1=App.ActiveDocument.getObject(f.Name) face=0 try: norm = f1.Shape.Faces[0].normalAt(0,0) say (norm) face=1 except: App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n") # stop if face==1: l = Draft.downgrade(f,delete=False) k = 0; bbM = 0 for o in l: for w in o: #print w.Name f_names.append (w.Name) say(w.Name) if "Facebinder" not in w.Name: bb=w.Shape.BoundBox bbX=float(bb.XLength) bbY=float(bb.YLength) bbZ=float(bb.ZLength) say (str(bbX)+";"+str(bbY)+";"+str(bbZ)) if bbX > bbM: bbM = bbX; m = k if bbY > bbM: bbM = bbY; m = k if bbZ > bbM: bbM = bbZ; m = k k=k+1 print f_names k = 0 #f_names=[] for o in l: for w in o: say(w.Name) #f_names.append (w.Name) if k!=m: say ( "deleting "+f_names[k] ) FreeCAD.ActiveDocument.removeObject(f_names[k]) else: FreeCADGui.ActiveDocument.getObject(f_names[k]).Visibility=False f = FreeCAD.ActiveDocument.addObject('Part::Extrusion', 'Extrude_for_cut') f = FreeCAD.ActiveDocument.getObject(f.Name) f.Base = FreeCAD.ActiveDocument.getObject(f_names[k]) f.Dir = norm * extrudeLenght * -1 f.Solid = (True) f.TaperAngle = (0) k=k+1 #FreeCAD.ActiveDocument.removeObject(f_names[len(l)]) say( f_names ) say( f_names[m] ) say( bbM ) FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.getObject(f.Name)) FreeCAD.ActiveDocument.recompute() sel = FreeCADGui.Selection.getSelection() #objs = [selobj.Object for selobj in selEx] coords = [] j = 0 s = sel[0].Shape bb=s.BoundBox bbX=float(bb.XLength) bbY=float(bb.YLength) bbZ=float(bb.ZLength) # boundBox boundBox_ = s.BoundBox a = str(boundBox_) a,b = a.split('(') c = b.split(',') oripl_X = float(c[0]) oripl_Y = float(c[1]) oripl_Z = float(c[2]) coords.append ([oripl_X+bbX/2, oripl_Y+bbY/2, oripl_Z+bbZ/2]) App.Console.PrintMessage(str(boundBox_)+"\r\n") App.Console.PrintMessage("BBox : "+str(bbX)+" x "+str(bbY)+" x "+str(bbZ)+"\r\n") App.Console.PrintMessage("Base Pos : "+str(oripl_X)+" x "+str(oripl_Y)+" x "+str(oripl_Z)+"\r\n") App.Console.PrintMessage("Center Pos : "+str(oripl_X+bbX/2)+" x "+str(oripl_Y+bbY/2)+" x "+str(oripl_Z+bbZ/2)+"\r\n") App.Console.PrintMessage("Coords : "+str(coords[j])+"\r\n") #objC = FreeCAD.ActiveDocument.addObject('Part::AttachableObjectPython', 'Clone_for_cut') #objC = FreeCAD.ActiveDocument.getObject(objC.Name) objC=Draft.clone(sel) if bbX!=0: scaleX = (bbX + 2*margin) / bbX else: scaleX = 1 if bbY!=0: scaleY = (bbY + 2*margin) / bbY else: scaleY = 1 if bbZ!=0: scaleZ = (bbZ + 2*margin) / bbZ else: scaleZ = 1 objC.Scale = (scaleX,scaleY,scaleZ) #Draft.scale(objC,delta=App.Vector(scaleX,scaleY,scaleZ),center=App.Vector(0,0,0),copy=True,legacy=True) oL = sel[0].Label + "_enlarged" objC.Label = oL FreeCADGui.Selection.addSelection(objC) FreeCAD.ActiveDocument.recompute() selEx = FreeCADGui.Selection.getSelectionEx() objs = [selobj.Object for selobj in selEx] coords = [] j = 0 if len(objs) >= 1: for obj in objs: #s = objs[0].Shape s = obj.Shape # boundBox boundBox_ = s.BoundBox boundBoxLX = boundBox_.XLength boundBoxLY = boundBox_.YLength boundBoxLZ = boundBox_.ZLength a = str(boundBox_) a,b = a.split('(') c = b.split(',') oripl_X = float(c[0]) oripl_Y = float(c[1]) oripl_Z = float(c[2]) coords.append ([oripl_X+boundBox_.XLength/2, oripl_Y+boundBox_.YLength/2, oripl_Z+boundBox_.ZLength/2]) App.Console.PrintMessage(str(boundBox_)+"\r\n") App.Console.PrintMessage("BBox : "+str(boundBox_.XLength)+" x "+str(boundBox_.YLength)+" x "+str(boundBox_.ZLength)+"\r\n") App.Console.PrintMessage("Base Pos : "+str(oripl_X)+" x "+str(oripl_Y)+" x "+str(oripl_Z)+"\r\n") App.Console.PrintMessage("Center Pos : "+str(oripl_X+boundBox_.XLength/2)+" x "+str(oripl_Y+boundBox_.YLength/2)+" x "+str(oripl_Z+boundBox_.ZLength/2)+"\r\n") App.Console.PrintMessage("Coords : "+str(coords[j])+"\r\n") if j>0: if cx==1: coordNx=coords[0][0]-coords[j][0] else: coordNx=0 if cy==1: coordNy=coords[0][1]-coords[j][1] else: coordNy=0 if cz==1: coordNz=coords[0][2]-coords[j][2] else: coordNz=0 obj.Placement.move(App.Vector(coordNx,coordNy,coordNz)) App.Console.PrintMessage("Moved : "+str(coordNx)+" "+str(coordNy)+" "+str(coordNz)+"\r\n") j=j+1 App.Console.PrintMessage("_____________________"+"\r\n") FreeCADGui.Selection.removeSelection(objs[0]) FreeCADGui.ActiveDocument.getObject(objs[0].Name).Visibility=False FreeCADGui.ActiveDocument.getObject(objs[1].Name).Transparency=70 App.ActiveDocument.recompute() else: App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n") else: App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n") else: sayw("no document to work with") #http://forum.freecadweb.org/viewtopic.php?t=4625